package com.briup.day07;

import java.util.Arrays;

/**
 * 自定义栈类
 */
public class Stack {
    /*
     栈的特性：先进后出，
     栈需要有两个方法：
        1. 将数据元素添加到栈区的方法 ===> push(int n)
        2. 将数据元素从栈区中移出的方法 ===> pop()
     */
    // 栈需要通过数组来实现，那么在本类中就需要维护一个数组的对象
    char[] arr;
    int size = 0;

    public Stack() {
        // 在构造器中调用其他构造器方法时，
        // 需要使用this替代构造器方法的名字
        this(1024);
    }

    public Stack(int length) {
        // 给数组变量进行初始赋值，
        // 通过指定的length变量确定数组的长度
        arr = new char[length];
    }

    // 实现将数据元素入栈的行为
    public void push(char arg) {
        // 将传入的参数入栈，即放入到数组中，
        // 通过size变量控制当前入栈元素的下标，
        // 以及统计当前栈中存储的元素个数
        arr[size++] = arg;
    }

    // 实现将数据元素出栈的行为，出栈时需要注意将出栈的元素返回
    public char pop() {
        // 出栈是将当前栈区内最后一个入栈的元素进行移出
        // size表示的是栈内第几个元素，先-1表示获取该元素的下标，
        // 同时将该元素出栈后，那么栈内元素个数就少1
        char s = arr[--size];
        // 将该栈内空间置空
        arr[size] = '\u0000';
        return s;
    }

    @Override
    public String toString() {
        // 通过Arrays.copyOf()方法，将数组中有确定值的数据放入到新数组中
        char[] ss = Arrays.copyOf(arr, size);
        // 将栈内已存的数据元素进行输出打印
        return Arrays.toString(ss);
    }
}